/**
 * Réalisation d'une Jauge avec des entiers naturels.
 * <p>
 * Un objet Jauge définit un niveau et un intervalle ouvert ]vigieMin, vigieMax[. 
 * Le niveau d'une jauge n'est pas limité aux valeurs dans l'intervalle.
 * <p>
 * L'état d'une jauge correspond à la position de son niveau par rapport à 
 * l'intervalle ]vigieMin, vigieMax[.
 * Une jauge définit trois etats : 
 * <ul>
 * <li>vert niveau dans l'intervalle, 
 * <li>rouge niveau supérieur à l'intervalle,
 * <li>bleu niveau inférieur à l'intervalle.
 * </ul>
 * 
 * @author georgy
 * @since 2006-2007
 */

package tec;

import java.math.BigInteger;

class JaugeNaturel { 
  private BigInteger valeur;
  private final BigInteger MIN;
  private final BigInteger MAX;

  /**
   * Construit une instance en précisant la valeur de départ de la Jauge
   * et l'intervalle de vigie.
   * 
   * @param vigieMin valeur minimale de l'intervalle de vigie.
   * @param vigieMax valeur maximale de l'intervalle de vigie.
   * @param depart   valeur initiale de la jauge.
   */
   public JaugeNaturel (String vigieMin, String vigieMax, String depart) throws java.lang.IllegalArgumentException {
      valeur = new BigInteger(depart);
      MIN = new BigInteger(vigieMin);
      MAX = new BigInteger(vigieMax);
      
      if (vigieMax.compareTo(vigieMin) < 0) {
         throw new java.lang.IllegalArgumentException ("Interval non valide soumis à JaugeNaturel.");
      }
   }
   
  /**
   * Construit une instance en précisant la valeur de départ de la Jauge
   * et l'intervalle de vigie.
   * 
   * @param vigieMin valeur minimale de l'intervalle de vigie.
   * @param vigieMax valeur maximale de l'intervalle de vigie.
   * @param depart   valeur initiale de la jauge.
   */
   public JaugeNaturel (long vigieMin, long vigieMax, long depart) throws java.lang.IllegalArgumentException {
      if (vigieMax < vigieMin) {
         throw new java.lang.IllegalArgumentException ("Interval non valide soumis à JaugeNaturel.");
         
      } else {
         valeur = new BigInteger(java.lang.Long.toString(depart));
         MIN = new BigInteger(java.lang.Long.toString(vigieMin));;
         MAX = new BigInteger(java.lang.Long.toString(vigieMax));;
      }
   }
   
   /**
   * L'état de la jauge est-il rouge ?
   *
   * @return vrai si niveau >=  vigieMax.
   *
   */
   public boolean estRouge() {
      return 0 <= valeur.compareTo(MAX);
   }
   
   /**
   * L'état de la jauge est-il vert ?
   *
   * @return vrai si niveau appartient à ]vigieMin, vigieMax[.
   *
   */
   public boolean estVert() {
      return MIN.compareTo(valeur) < 0 && 0 < MAX.compareTo(valeur);
   }
   
   /**
   * L'état de la jauge est-il bleu ?
   *
   * @return vrai si niveau <= vigieMin.
   */
   public boolean estBleu() {
      return valeur.compareTo(MIN) <= 0;
   }
   
   /**
   * Incrémente le niveau d'une unité.
   * L'état peut devenir supérieur à vigieMax.
   */
   public void incrementer() {
      valeur = valeur.add(BigInteger.ONE);
   }
   
   /**
   * Décrémente le niveau d'une unité.
   * L'état peut devenir inférieur à la vigieMin.
   */
   public void decrementer() {
      valeur = valeur.subtract(BigInteger.ONE);
   }
   
   /**
    * Renvoie le pourcentage d'occupation dans de la jauge.
    */
   public float pourcentageOccupation () {
      return 100.f*(valeur.subtract(MIN).floatValue()/MAX.subtract(MIN).floatValue());
   }
   
   /**
    * Cette méthode est héritée de la classe {@link java.lang.Object}.
    * Très utile pour le débogage, elle permet de fournir une 
    * chaîne de caractères correspondant a l'état d'un objet.
    * <p> Un code par défaut est définit dans 
    * {@link java.lang.Object#toString() la classe Object} 
    * Il faut adapter (redéfinir) le code de cette méthode à chaque classe.
    *
    * Pour les chaînes de cararctères, l'opérateur + correspond a la concaténation. 
    * Les valeurs numériques sont alors convertit en ascii.
    * Si l'état d'une instance de cette classe est vigieMin=-456, vigieMax=23,
    * valeur=-7, la concaténation donne la chaîne "<-7 [-456,23]>".
    */
   @Override
   public String toString() {
      return "<" + valeur.toString () + " [" + MIN.toString () + "," + MAX.toString () + "]>"; 
   }
}
